Back at the time when I was uploading new versions of Test::Run::CmdLine, I found out that some CPAN testers report were failing because one of the scripts that was supposed to be installed by a dependency, and was used in a test, was not available in the path.
My solution to this was to make sure the script just called the "run()" function of a module, and then to invoke the module in the tests from the command line like this:
perl -MApp::MyApp -e 'run()' -- --name "Sophie"
App::MyApp can be something like:
package App::MyApp;
use strict;
use warnings;
use base 'Exporter';
our @EXPORT=(qw(run));
use Getopt::Long;
sub run
{
my $name = "World";
GetOptions("name=s" => \$name);
print "Hello, $name!\n";
}
1;
It's also useful to be able to run such programs without needing to install scripts and with just dependence on the Perl module's path.
On my homepage makefile, I have the following rules to handle the Screenplays:
lib/docbook/xml/%.xml: lib/screenplay-xml/xml/%.xml perl -MXML::Grammar::Screenplay::App::ToDocBook -e 'run()' -- \ -o $@ $< lib/screenplay-xml/html/%.html: lib/screenplay-xml/xml/%.xml perl -MXML::Grammar::Screenplay::App::ToHTML -e 'run()' -- \ -o $@ $< lib/screenplay-xml/xml/%.xml: lib/screenplay-xml/txt/%.txt perl -MXML::Grammar::Screenplay::App::FromProto -e 'run()' -- \ -o $@ $<
This solves me the problem of depending on the scripts being in the path.